#pragma once

namespace gtl
{

template<class T>
class safe_bool 
{
	struct dummy { void nonnull(){}; };
	typedef void (dummy::*safe_type)();

public:
	operator safe_type()
	{
		return static_cast<T*>(this)->null() ? 0 : &dummy::nonnull;
	}

	operator safe_type() const
	{
		return static_cast<const T*>(this)->null() ? 0 : &dummy::nonnull;
	}
};

} // end of namespace gtl